package top.reminis.utils;

import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;

/**
 * MinIO桶管理工具
 * 使用MinIO Java客户端进行桶的创建和管理
 * 
 * @author zwf
 * @create 2025-09-25
 */
@Slf4j
public class MinIOBucketManager {
    
    /**
     * 确保MinIO桶存在，如果不存在则创建
     * 
     * @param endpoint MinIO端点
     * @param accessKey 访问密钥
     * @param secretKey 秘密密钥
     * @param bucket 桶名称
     * @return 桶是否存在或创建成功
     */
    public static boolean ensureBucketExists(String endpoint, String accessKey, String secretKey, String bucket) {
        try {
            log.info("检查MinIO桶是否存在: {}", bucket);
            log.info("Endpoint: {}", endpoint);
            log.info("Access Key: {}", accessKey);
            log.info("Secret Key: {}", secretKey.length() > 0 ? "***" : "空");
            
            // 创建MinIO客户端
            MinioClient minioClient = MinioClient.builder()
                    .endpoint(endpoint)
                    .credentials(accessKey, secretKey)
                    .build();
            
            // 检查桶是否存在
            boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder()
                    .bucket(bucket)
                    .build());
            
            if (bucketExists) {
                log.info("桶 '{}' 已存在", bucket);
                return true;
            } else {
                log.info("桶 '{}' 不存在，尝试创建...", bucket);
                try {
                    // 创建桶
                    minioClient.makeBucket(MakeBucketArgs.builder()
                            .bucket(bucket)
                            .build());
                    
                    // 注意：版本控制功能暂时跳过，因为API可能有变化
                    log.info("桶 '{}' 创建成功，版本控制功能暂时跳过", bucket);
                    
                    log.info("桶 '{}' 创建成功", bucket);
                    return true;
                    
                } catch (Exception e) {
                    log.error("创建桶 '{}' 失败: {}", bucket, e.getMessage(), e);
                    return false;
                }
            }
            
        } catch (Exception e) {
            log.error("MinIO桶管理操作失败", e);
            return false;
        }
    }
    
    /**
     * 创建MinIO客户端
     * 
     * @param endpoint MinIO端点
     * @param accessKey 访问密钥
     * @param secretKey 秘密密钥
     * @return MinIO客户端实例
     */
    public static MinioClient createMinioClient(String endpoint, String accessKey, String secretKey) {
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }
    
    /**
     * 测试MinIO连接
     * 
     * @param endpoint MinIO端点
     * @param accessKey 访问密钥
     * @param secretKey 秘密密钥
     * @return 连接是否成功
     */
    public static boolean testConnection(String endpoint, String accessKey, String secretKey) {
        try {
            MinioClient minioClient = createMinioClient(endpoint, accessKey, secretKey);
            
            // 尝试列出所有桶来测试连接
            minioClient.listBuckets();
            log.info("MinIO连接测试成功");
            return true;
            
        } catch (Exception e) {
            log.error("MinIO连接测试失败: {}", e.getMessage(), e);
            return false;
        }
    }
}
